// Promise 是异步编程的一种解决方案
// 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。
// 从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。Promise 提供统一的 API，
// 各种异步操作都可以用同样的方法进行处理。

function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms, 'done');
    });
}

timeout(100).then((value) => {
    console.log(value);
});

// Promise对象有以下两个特点。
// （1）对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：
// pending（进行中）、fulfilled（已成功）和rejected（已失败）。
// 只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。
// （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：
// 从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，
// 会一直保持这个结果，这时就称为 resolved（已定型）。
// 如果改变已经发生了，你再对Promise对象添加回调函数，也会立即得到这个结果。

// Promise也有一些缺点。首先，无法取消Promise，一旦新建它就会立即执行，无法中途取消。
// 其次，如果不设置回调函数，Promise内部抛出的错误，不会反应到外部。
// 第三，当处于pending状态时，无法得知目前进展到哪一个阶段（刚刚开始还是即将完成）。

let promise = new Promise(function(resolve, reject) {
    console.log('Promise');
    resolve();
});

promise.then(function() {
    console.log('resolved.');
});

console.log('Hi!');




